/**
 * 查询是否有指定图层
 * @param {string} name
 */
function hasLayer(name) {
    map.eachLayer(function (layer) {
        if (layer.getAttribution() == name) {
            return true;
        }
    });
    return undefined;
}

/**
 * 根据名字移除图层
 * @param name [string] 图层名称
 */
function removeLayer(name) {
    map.eachLayer(function (layer) {
        if (layer.getAttribution() == name) {
            map.removeLayer(layer);
        }
    });
}

/**
 * 画矩形
 * @param points {LatLng[]} 两个点
 * @param name {String} 名称
 */
function drawRectangle(points, name) {
    if (points.length != 2) {
        return
    }
    L.rectangle(L.latLngBounds(points[0], points[1]), {color: "#ff7800", weight: 1, attribution: name}).addTo(map);
}

/**
 * 替换TMS链接中的xyz
 * @param url
 * @param x {Number} 行号
 * @param y {Number} 列号
 * @param z {Number} 缩放等级
 * @return {string} 替换后的TMS瓦片地址
 */
function getCurrentUrl(url, x, y, z) {
    //需要在以后改进正则，匹配大小写
    let result = url.replace("{x}", x);
    result = result.replace("{y}", y);
    result = result.replace("{z}", z);
    return result;
}

/**
 * 根据等级和坐标范围计算包含瓦片坐标
 * @param xMin {Number}  最小x值
 * @param yMin {Number}  最小y值
 * @param xMax {Number}  最大y值
 * @param yMax {Number}  最大y值
 * @param level Number} 地图等级
 * @param type TMS规则类型
 */
function getTMSCoord(xMin, yMin, xMax, yMax, level, type) {
    const EXTENDS_3857 = 20037508.3427892;
    let array = [];
    let tile_size = EXTENDS_3857 / Math.pow(2, level - 1);//当前等级瓦片坐标宽度（宽高相等）
    let x1 = Math.ceil((xMin + EXTENDS_3857) / tile_size) - 1;//起始X,减1是因为从0开始
    let x2 = Math.ceil((xMax + EXTENDS_3857) / tile_size) - 1;//终止X

    let y1 = 0, y2 = 0;

    switch (type) {
        case 0:
            //谷歌地图TMSy值计算
            y1 = Math.ceil((EXTENDS_3857 - yMax) / tile_size) - 1;//起始y
            y2 = Math.ceil((EXTENDS_3857 - yMin) / tile_size) - 1;//终止y
            break;
        case 1:
            //标准TMSy值计算
            y1 = Math.ceil((yMin + EXTENDS_3857) / tile_size) - 1;//起始y
            y2 = Math.ceil((yMax + EXTENDS_3857) / tile_size) - 1;//终止y
            break;
        default:
            break;
    }
    //超出范围异常计算
    if((x2-x1)*(y2-y1)>5000000){
        return array
    }
    //防止计算产生负值
    if (x1 < 0) {
        x1 = 0;
    }
    if (x2 < 0) {
        x2 = 0;
    }
    if (y1 < 0) {
        y1 = 0;
    }
    if (y2 < 0) {
        y2 = 0;
    }
    for (let j = x1; j <= x2; j++) {
        for (let k = y1; k <= y2; k++) {
            array.push([j,k,level]);
            // sendDownCmd(j,k,level);
            //j就是url中的x,
            //k就是url中的y,
            //level就是地图等级对应url中的z
        }
    }

    return array;
}

/**
 * 4326坐标系转3857
 * @param lat {Number} 纬度
 * @param lng {Number} 经度
 * @constructor
 */
function Wgs84ToMector(lat, lng) {
    const EXTENDS_3857 = 20037508.3427892;
    const radio = EXTENDS_3857 / 180;
    let x = lng * radio;
    let y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / Math.PI * 180;
    y = y * radio;
    return [x, y];
}

/**
 * 通过proj4js库将4326坐标系转到web墨卡托3857坐标系
 * @param lat
 * @param lng
 * @return {*}
 * @constructor
 */
function Wgs84ToMector2(lat, lng) {
    const proj4 = require('proj4');
    return proj4(proj4('EPSG:4326'), proj4('EPSG:3857'), [lng, lat])
}
